package geekTime.chapter21CAS;

/**
 * 模拟实现CAS指令
 * java中的compareAndSet的返回值类型是boolean
 * Created by LinGer on 2019/6/28
 */
public class SimulatedCAS {

    private int count;
    private int newValue;

    /**
     * 无锁实现线程安全的count+=1
     * CAS+自旋(循环尝试)
     */
    public void addOne(){
        do{
            //1.首先计算
            newValue = count + 1;

            //2.如果cas(count, newValue)返回的值不等于count，
            // 说明在1执行之后，cas执行之前，count的值被其他线程更改过
        }while (count != cas(count, newValue));
    }

    /**
     * Compare And Swap
     * @param expect 期望值
     * @param newValue 更新值
     * @return 如果不符合期望值，返回原本值
     */
    public synchronized int cas(int expect, int newValue){
        //读取目前count的值
        int curValue = count;
        if(curValue == expect){
            //如果目前值==期望值，则更新count的值
            count = newValue;
        }
        //如果不符合期望值，返回原来的值
        return curValue;
    }
}
